package com.c2b.algorithm.leetcode.base;

/**
 * <a href="https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/description/?envType=study-plan-v2&envId=top-interview-150">寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array)</a>
 * <p>
 * 已知一个长度为 n 的数组，预先按照升序排列，经由 1 到 n 次 旋转 后，得到输入数组。例如，原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到：
 *     <ul>
 *         <li>若旋转 4 次，则可以得到 [4,5,6,7,0,1,2]</li>
 *         <li>若旋转 7 次，则可以得到 [0,1,2,4,5,6,7]</li>
 *     </ul>
 * </p>
 * <p>注意，数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。</p>
 * <p>给你一个元素值<b>互不相同</b>的数组 nums ，它原来是一个升序排列的数组，并按上述情形进行了多次旋转。请你找出并返回数组中的<b>最小元素</b>。</p>
 * <p>你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：nums = [3,4,5,1,2]
 *      输出：1
 *      解释：原数组为 [1,2,3,4,5] ，旋转 3 次得到输入数组。
 *
 * 示例 2：
 *      输入：nums = [4,5,6,7,0,1,2]
 *      输出：0
 *      解释：原数组为 [0,1,2,4,5,6,7] ，旋转 4 次得到输入数组。
 *
 * 示例 3：
 *      输入：nums = [11,13,15,17]
 *      输出：11
 *      解释：原数组为 [11,13,15,17] ，旋转 4 次得到输入数组。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *  <ul>
 *      <li>n == nums.length</li>
 *      <li>1 <= n <= 5000</li>
 *      <li>-5000 <= nums[i] <= 5000</li>
 *      <li>nums 中的所有整数 互不相同</li>
 *      <li>nums 原来是一个升序排序的数组，并进行了 1 至 n 次旋转</li>
 *  </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/10/19 18:18
 */
public class LC0153FindMinimumInRotatedSortedArray_M {

    static class Solution {
        public int findMin(int[] nums) {
            int length = nums.length;
            // nums[0] == nums[length - 1]:说明只有一个元素
            // nums[0] <  nums[length - 1]:说明没有进行过旋转
            if ( nums[0] <= nums[length - 1]) {
                return nums[0];
            }
            int left = 0;
            int right = nums.length - 1;
            int mid;
            while (left < right) {
                mid = left + ((right - left) >> 1);
                if (nums[mid] < nums[right]) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            return nums[left];
        }
    }
}
